package com.heima.leetcode.practice;

/**
 * @description: leetcode 3 最长不重复子串
 * @author 勾新杰
 * @version 1.0
 * @date 2024/11/25 22:29
 */
public class E3 {

    /**
     * <h3>1. 滑动窗口法</h3>
     * @param s 字符串
     * @return 最长不重复子串的长度
     */
    @SuppressWarnings("all")
    public int lengthOfLongestSubstring(String s) {
        int left = 0;
        int right = 0;
        char[] array = s.toCharArray();
        int[] count = new int[128];
        int max = 0;
        while(right < array.length){
            char c = array[right];
            // 窗口内没有该字符，则添加
            if(count[c] == 0){
                count[c]++;
            }
            // 窗口内已有该字符，则移动左指针，直到移除该字符
            else{
                max = Math.max(max, right - left);
                while(array[left] != c){
                    count[array[left++]]--;
                }
                count[array[left++]]--;
                count[c]++; // 不要忘记添加当前字符的次数
            }
            right++;
        }
        max = Math.max(max, right - left);
        return max;
    }
}
